/*
Copyright 2012 Martin Sliwka

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#pragma once

class AsyncNamedPipeT;
typedef std::shared_ptr<AsyncNamedPipeT> AsyncNamedPipePtr;

class AsyncNamedPipeT
{
public:
	AsyncNamedPipeT();
	~AsyncNamedPipeT();

	HRESULT Create( LPCTSTR pName, bool FirstInstance );
	HRESULT StartTransfer( AsyncNamedPipePtr Writer );
	HRESULT WaitForCompletion( DWORD Timeout );
	void Destroy();

protected:

	HANDLE				mThread;

	static unsigned int WINAPI ThreadProcWrapper( LPVOID lpParameter );
	unsigned int ThreadProc();
	
	void Listen();
	
	HRESULT Connect();
	HRESULT Peek( DWORD& BytesAvailable );
	HRESULT Read( LPBYTE pBuffer, DWORD BytesToRead, DWORD& BytesRead );
	HRESULT Write( LPBYTE pBuffer, DWORD BytesToWrite, DWORD& BytesWritten );
	void Disconnect();

	bool				mFirstInstance;
	HANDLE				mConnected;
	HANDLE				mPipe;
	AsyncNamedPipePtr	mOtherPipe;

};

